package com.qf.filter;

import com.qf.entity.Admin;
import com.qf.util.PropertiesUtils;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;

/**
 * 约定 > 配置 > 编码
 *
 * description: 控制系统登录，如果没有登录则无法访问某些资源
 * author: Ken
 * 公众号：Java架构栈
 */
@WebFilter(urlPatterns = "/*")
public class Filter010Login implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    /**
     * doFilter 每发一次请求，这个方法就会整体的执行一次
     * 没有登录则不放行
     * @param request
     * @param response
     * @param filterChain
     * @throws IOException
     * @throws ServletException
     */
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
//        System.out.println("登录过滤器触发！");
        //强制类型转换 请求和响应
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse resp = (HttpServletResponse) response;

        //获得拦截的url
        String uri = req.getRequestURI(); //uri = /index.jsp
//        System.out.println("过滤的url：" + uri);

        //先通过request对象获得session对象
        HttpSession session = req.getSession();
        //从session对象中一个名字为login_user的属性值，这个属性值代表的是登录的用户信息
        Admin admin = (Admin) session.getAttribute("login_user");

        if (admin != null) {
            //当前已经登录，直接放行
            filterChain.doFilter(req, resp);
            return;
        }

        //没有登录
        //从配置文件中获取到希望直接放行的资源（不管是否登录）
        //login.jsp|code|register.jsp|registerfile|login|.js|.css|.jpg|.png|.gif
        String nologin = PropertiesUtils.getProperties("nologin");
        System.out.println("配置文件获取数据：" + nologin);
        System.out.println("配置文件获取数据：" +  PropertiesUtils.getProperties("controller.base"));
        //判断放行的资源是否为空
        if (nologin == null) {
            //跳转到登录页进行登录
            resp.sendRedirect("login.jsp");
            return;
        }

        //说明资源不为null
        //获得不需要登录也可以访问的资源数组
        //{login.jsp,code,register.jsp,registerfile,login,.js,.css,.jpg,.png,.gif}
        //uri=/login.jsp  /abc.js  /index.jsp
        String[] res = nologin.split("\\|");
        for (String re : res) {
            if (uri.endsWith(re)) {
                //说明当前的资源可以不登录就访问
                //放行
                filterChain.doFilter(req, resp);
                return;
            }
        }
        //跳转到登录页进行登录
        resp.sendRedirect("login.jsp");
    }

    @Override
    public void destroy() {

    }
}
